package upm.etsit.gsi.lejos.mazesolver.behaviours;

import upm.etsit.gsi.lejos.mazesolver.DataExchange;
import lejos.nxt.Motor;
import lejos.robotics.navigation.TachoPilot;
import lejos.robotics.subsumption.Behavior;

/**
 * Comprueba si puede girar a la izquierda, en caso afirmativo, rota el robot 90º a la izquierda y pone DE.direction a 0, para que tome el control GoStraight, en caso negativo, simplemente pone DE.direction a 2 para que tome el control TurnLeft
 * @author jrubia
 */
public class TurnLeft implements Behavior {

    /**
     * Piloto que controla el movimiento del robot.
     */
    private TachoPilot piloto;

    /**
     * Intercambiador de datos.
     */
    private DataExchange DE;

    /**
     * Mapeador.
     */
    private Mapper mapeador;

    /**
     * Contructor con parámetros.
     *
     * @param piloto
     * @param DEx
     * @param mapeador
     */
    public TurnLeft(TachoPilot piloto, DataExchange DEx, Mapper mapeador) {
        this.piloto = piloto;
        this.mapeador = mapeador;
        DE = DEx;

    }

    /**
     * Toma el control cuando DE.direction es 1.
     * @return
     */
    public boolean takeControl() {
        return DE.getDirection() == 1;
    }

    /**
     * Gira la cabeza a la izquierda para comprobar si puede girar, en caso afirmativo, gira y cede el control a GoStraight, en caso contrario, no gira y le cede el control a TurnRight.
     * Siempre vuelve a poner la cabeza mirando al frente.
     */
    public void action() {
        Motor.B.rotateTo(90);
        if(this.DE.getDistance() > DE.getDIS_SEG()) {
            this.piloto.rotate(90);
            this.mapeador.rotate(90);
            Motor.B.rotateTo(0);
            DE.setDirection(0);
        } else {
            Motor.B.rotateTo(0);
            DE.setDirection(2);
        }
    }

    /**
     * Cuando se suprime el comportamiento, no hace nada, puesto que en action() ya nos hemos asegurado de que sea otro comportamiento quien tome el control.
     */
    public void suppress() {
    }
}
